package cn.ljy.authority.dao.mapper;

import cn.ljy.authority.model.SysRole;
import cn.ljy.authority.model.SysUserRole;
import org.apache.ibatis.annotations.*;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * 专门处理角色与账户的关系
 */
@Mapper
public interface SysUserRoleMapper {
    /**
     * 根据指定账户包含的角色集合
     * @param userId
     * @return
     */
    List<SysRole> findAllRoleByUserId(long userId);

    /**
     * 根据指定账户包含的可用角色集合
     * @param userId
     * @return
     */
    List<SysRole> findAllEnabledRoleByUserId(long userId);

    /**
     * 根据指定账户包含的角色集合
     * @param userId
     * @param roleEnabled 角色是否可用。如果传递的是null则查询所有角色
     * @return
     */
    List<SysRole> findAllRoleByUserIdAndRoleEnabled(@Param("userId") long userId,@Param("roleEnabled") Boolean roleEnabled);

    /**
     * 根据指定账户获取拥有的所有角色数量
     * @param userId
     * @return
     */
    @Select("select count(1) from sys_user_role where user_id = #{userId}")
    int countAllRoleByUserId(long userId);

    /**
     * 移除指定角色对应的所有账户关系
     * @param roleId
     * @return 移除的账户角色关系数量
     */
    @Delete("delete from sys_user_role where role_id = #{roleId}")
    int removeAllUserByRoleId(Serializable roleId);

    /**
     * 根据指定账户和指定角色的总数
     * @param userId
     * @return 1表示存在，0表示不存在。1以上数值说明数据库有误
     */
    @Select(" select count(1) from sys_user_role where user_id = #{userId} and role_id=#{roleId}")
    int countByUserIdAndRoleId(Serializable userId, Serializable roleId);

    /**
     * 插入账户和角色的关系
     * @param userId
     * @param roleId
     * @return
     */
    @Insert(" insert into sys_user_role(user_id,role_id,create_time) values(#{userId},#{roleId},now())")
    int save(Serializable userId, Serializable roleId);

    /**
     * 移除账户和角色的关系
     * @param userId
     * @param roleId
     * @return
     */
    @Delete("delete from sys_user_role where user_id=#{userId} and role_id=#{roleId}")
    int delete(Serializable userId, Serializable roleId);

    /**
     * 删除该账户对应的角色与账户的关系
     * @param userIds 账户集合
     */
    int deleteByUserIds(java.io.Serializable[] userIds);

    /**
     * 一次插入多条记录,并且每个记录在插入后都会自动为集合内的元素加上主键
     * 说明：集合为空则不插入任何记录
     * @param collection 不能为Null,且集合不能为空
     * @return 返回插入的记录数
     */
    int saveAllIn(Collection<SysUserRole> collection);

    /**
     *批量删除集合对象，长度如果为0则不进行任何处理
     * @param collection
     * @return  删除的记录数，>=1表示删除成功，0表示删除失败
     */
    int deleteAllIn(@Param(value = "collection")Collection<SysUserRole> collection);

}
